// #include <iostream>
// #include<string>
// #include<functional>
// #include<map>
//
//
//
// using namespace std;
//
// //函数包装器 把函数指针包装成功对象
//
// int Max(int a,int b)
// {
//     return  a > b ? a:b;
// }
//
// class Test
// {
// public:
//     void operator()(string info)
//     {
//         cout << info << endl;
//     }
//     //包装对象隐式转换的函数指针
//     static void print(int a,int b)
//     {
//         cout << a+b << endl;
//     }
//
//     using FuncType = void(*)(int,int);
//
//     operator FuncType()
//     {
//         return print;
//     }
//
//     void print_data(string info)
//     {
//         cout <<  info << endl;
//     }
//
//
// };
//
//
// void test_functional()
// {
//     //1.包装普通函数
//     //function<返回值类型(参数类型)>
//     function<int(int,int)> pmax(&Max);
//     cout << pmax(1,2) << endl;
//
//     //包装仿函数 仿函数  对象作为赋值
//     Test test;
//     function<void(string)> p1(test);
//     p1("仿函数");
//
//     // 对象隐式转换的指针
//
//     function<void(int,int)> p2 = test;
//     p2(1,2);
//
//     //包装成员函数 借用函数适配器
//     function<void(string)> p3 = bind(&Test::print_data,&test,placeholders::_1);
//
//     p3("abc");
//
// }
//
// void print_test(int a,string b,Test test)
// {
//     cout << "bind调整参数顺序用functional绑定" << endl;
//
// }
//
// void test_function_bind()
// {
//     auto p3 =bind(&print_test,placeholders::_2,placeholders::_3,placeholders::_1);
//     Test test;
//     p3(test,1,"abc");
// }
// //函数包装器 统一调用接口
//
// int sum(int a,int b)
// {
//     return a+b;
// }
// auto sub=[](int a,int b)->int{return a-b;};
//
//
// class mul
// {
// public:
//     int operator()(int a,int b)
//     {
//         return a*b;
//     }
// };
//
// void test_demo()
// {
//     string op;
//     int a;
//     int b;
//     cin >> a >> op >> b;
//     cout << a << op << b <<"=";
// #ifdef  null
//     if (op=="+")
//     {
//         cout << sum(a,b) <<endl;
//     }else if (op=="-")
//     {
//         cout << sub(a,b) <<endl;
//     }else if (op=="*")
//     {
//         cout << mul()(a,b) << endl;
//     }else
//     {
//         cout << "错误" << endl;
//     }
// #endif
//     map<string,function<int(int,int)>> calc = {
//         {"+",sum},
//         {"-",sub},
//         {"*",mul()}
//     };
//
//     cout << calc[op](a,b) << endl;
// }
//
//
//
// int main()
// {
//     // test_functional();
//     // test_function_bind();
//
//     test_demo();
//
//     return 0;
// }